﻿-------------------------------------------------------------------------------------------------------------
----------------------------------------pca_caja.resumen_liquidaciones---------------------------------------
-------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_caja.fn_calcular_resumen_liquidacion(varchar,--empresa_id $1
								    varchar,--oficina_id $2
								    bigint,--liquidacion_id $3
								    character --usuario_id $4
								    )RETURNS void AS
$$
BEGIN
	DELETE FROM pca_caja.resumen_liquidaciones WHERE 
		empresa_id = $1 AND
		oficina_id = $2 AND
		liquidacion_id = $3 AND
		usuario_id = $4;
	
	INSERT INTO pca_caja.resumen_liquidaciones 
		SELECT 
			$1,
			$2,
			$3,
			$4,
			tipo_movimiento_id,
			moneda_id,
			SUM(monto)
		FROM
			 pca_caja.vw_movimientos
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			liquidacion_id = $3 AND
			usuario_id = $4
		GROUP BY
			tipo_movimiento_id,
			moneda_id;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_resumen_liquidacion(varchar,--empresa_id $1
							       varchar,--oficina_id $2
							       bigint,--liquidacion_id $3
							       character --usuario_id $4
							       )RETURNS SETOF pca_caja.vw_resumen_liquidaciones AS
$$
DECLARE
	_row pca_caja.vw_resumen_liquidaciones%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_caja.vw_resumen_liquidaciones
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			liquidacion_id = $3 AND
			usuario_id = $4
		ORDER BY
			tipo_movimiento_id DESC
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;


-------------------------------------------------------------------------------------------------------------
---------------------------------------------pca_caja.liquidaciones------------------------------------------
-------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_caja.fn_add_liquidacion(varchar,--empresa_id $1
						       varchar,--oficina_id $2
						       varchar --usuario_id $3
						       )RETURNS bigint AS
$$
DECLARE
	_row pca_caja.liquidaciones%ROWTYPE;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_caja.liquidaciones
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		usuario_id = $3 AND
		cerrado = false;
		
	IF NOT FOUND THEN
		INSERT INTO pca_caja.liquidaciones
			(empresa_id,
			oficina_id,
			usuario_id)
		VALUES
			($1,$2,$3);

		RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_caja.seq_liquidacion_id')::integer);
	ELSE
		RAISE EXCEPTION 'Existen una liquidacion pendiente con fecha-hora inicio % % ',_row.fecha_hora_inicio::date,to_char(_row.fecha_hora_inicio,'HH12:MI PM');
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones_activa(varchar,--empresa_id $1
								     varchar,--oficina_id $2
								     varchar --usuario_id $3
								     )RETURNS SETOF pca_caja.liquidaciones AS
$$
DECLARE
	_row pca_caja.liquidaciones%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_caja.liquidaciones
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			usuario_id = $3 AND
			cerrado = false
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_liquidacion(varchar,--empresa_id $1
						       varchar,--oficina_id $2
						       bigint,--liquidacion_id $3
						       varchar --usuario_id $4
						       )RETURNS SETOF pca_caja.liquidaciones AS
$$
DECLARE
	_row pca_caja.liquidaciones%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_caja.liquidaciones
		WHERE
			empresa_id = $1 AND
			oficina_id = $2 AND
			liquidacion_id = $3 AND
			usuario_id = $4
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones(integer,--start $1
							      integer,--limit $2
							      varchar,--empresa_id $3
							      varchar,--oficina_id $4
							      varchar --usuario_id $5
							      )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_caja.vw_liquidaciones
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			usuario_id = $5
		ORDER BY
			fecha_hora_inicio DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_caja.vw_liquidaciones
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			usuario_id = $5;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones(integer,--start $1
							      integer,--limit $2
							      varchar,--empresa_id $3
							      varchar,--oficina_id $4
							      varchar,--usuario_id $5
							      boolean --cerrado $6
							      )RETURNS SETOF pca_caja.vw_liquidaciones AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_caja.vw_liquidaciones
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			usuario_id = $5 AND
			cerrado = $6
		ORDER BY
			fecha_hora_sistema DESC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			count(*)
		FROM
			pca_caja.vw_liquidaciones
		WHERE
			empresa_id = $3 AND
			oficina_id = $4 AND
			usuario_id = $5 AND
			cerrado = $6;
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_caja.fn_cerrar_liquidacion(varchar,--empresa_id $1
							  varchar,--oficina_id $2
						          bigint,--liquidacion_id $3
							  character --usuario_id $4
							  )RETURNS void AS
$$
BEGIN
	UPDATE pca_caja.liquidaciones SET
		cerrado = true,
		fecha_hora_cierre = now()
	WHERE
		empresa_id = $1 AND
		oficina_id = $2 AND
		liquidacion_id = $3 AND
		usuario_id = $4;

	PERFORM pca_caja.fn_calcular_resumen_liquidacion($1,$2,$3,$4);
END;
$$
LANGUAGE plpgsql;